package com.xjie.mall.common;

// 导入Lombok的Data注解，用于自动生成getter、setter、toString等方法
import lombok.Data;

// 导入Serializable接口，使对象可以序列化
import java.io.Serializable;

/**
 * 通用响应结果封装类，用于统一API接口返回格式
 * @param <T> 响应数据的泛型类型
 */
@Data
public class Result<T> implements Serializable {

    // 响应数据结果集，存储具体的业务数据
    private T data;

    /**
     * 状态码
     * 200 操作成功
     * 201 操作失败
     */
    private Integer code;

    /**
     * 响应信息
     */
    private String message;

    /**
     * 无参构造函数，创建空的结果对象
     */
    public Result()
    {

    }

    /**
     * 根据响应码枚举创建结果对象的构造函数
     * @param resultCode 响应码枚举对象
     */
    public Result(RespCode resultCode)
    {
        // 设置响应状态码
        this.code = resultCode.getCode();
        // 设置响应消息
        this.message = resultCode.getMessage();
    }

    /**
     * 根据数据和响应码枚举创建结果对象的构造函数
     * @param data 响应数据
     * @param resultCode 响应码枚举对象
     */
    public Result(T data,RespCode resultCode)
    {
        // 设置响应数据
        this.data = data;
        // 设置响应状态码
        this.code = resultCode.getCode();
        // 设置响应消息
        this.message = resultCode.getMessage();
    }

    /**
     * 创建自定义错误信息的静态方法
     * @param code 错误状态码
     * @param message 错误信息
     * @return 包含指定错误码和信息的结果对象
     */
    public static Result secByError(Integer code,String message)
    {
        // 创建新的结果对象
        Result err = new Result();
        // 设置错误状态码
        err.setCode(code);
        // 设置错误信息
        err.setMessage(message);
        // 返回结果对象
        return err;
    }

    /**
     * 创建成功响应的静态方法（无数据）
     * @return 成功状态的结果对象
     */
    public static Result success()
    {
        // 返回成功的响应结果，数据为空
        return new Result(null,RespCode.SUCCESS);
    }

    /**
     * 创建带数据的成功响应的静态方法
     * @param data 响应数据
     * @return 成功状态的结果对象
     */
    public static Result success(Object data)
    {
        // 返回包含数据的成功响应结果
        return new Result(data,RespCode.SUCCESS);
    }

    /**
     * 创建默认错误响应的静态方法（无数据）
     * @return 错误状态的结果对象
     */
    public static Result error()
    {
        // 返回默认的错误响应结果，数据为空
        return new Result(null,RespCode.ERROR);
    }

    /**
     * 创建指定错误码的错误响应的静态方法
     * @param resultCode 错误码枚举
     * @return 错误状态的结果对象
     */
    public static Result error(RespCode resultCode)
    {
        // 返回指定错误码的响应结果
        return new Result(resultCode);
    }

    /**
     * 创建指定错误信息的错误响应的静态方法
     * @param message
     * @return
     */
    public static Result error(String message)
    {
        return secByError(RespCode.ERROR.getCode(),message);
    }

}
